import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.Set;

public class Text {
    WebDriver driver = null;

    public void createDriver() {
        // 1. 使用驱动打开浏览器
        WebDriverManager.chromedriver().setup();
        // 增加浏览器, 创建驱动对象要强制允许访问所有的链接
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");

        driver = new ChromeDriver(options);
        driver.get("https://www.baidu.com");
    }
    /**
     * 定位元素
     * @throws InterruptedException
     */
    public void test01() throws InterruptedException {
        createDriver();
        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);

        driver.quit();
    }

    /**
     * 切换窗口
     * @throws InterruptedException
     */
    public void test02() throws InterruptedException {
        createDriver();
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        // 获取当前页面句柄
        String oldlWindow = driver.getWindowHandle();
        // 获取全部句柄
        Set<String> allWindow = driver.getWindowHandles();
        // 切换到新闻页面
        for(String str : allWindow) {
            if(str != oldlWindow) {
                driver.switchTo().window(str);
            }
        }
        // 获取 "热点要闻" 的元素
        String rest = driver.findElement(By.cssSelector("#headline-tabs > ul > li > a")).getText();
        System.out.println(rest);
        // 关闭新闻页面
        driver.close();
        // 切换到原来页面
        driver.switchTo().window(oldlWindow);
        // 定位原页面的 "AI助手" 元素
        String text = driver.findElement(By.cssSelector("#csaitab")).getText();
        System.out.println(text);
        driver.quit();
    }

    /**
     * 等待
     */
    public void test03() throws InterruptedException {
        createDriver();

        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        driver.findElement(By.cssSelector("#su")).click();
        // 此处由于页面没有加载出来, 然后去请问百度百科资料的元素,就会报  NoSuchElementException(无法定位元素)
        // 强制等待
//        Thread.sleep(1000);
        // 隐式等待, 等待3秒, 作用整个脚本的所有元素
        // 在指定的时间一直查找元素,找到继续执行, 找不到就报错
//        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        // 显示等待
        // 显⽰等待是智能等待，可以⾃定义显⽰等待的条件，操作灵活
        WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));
        wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#\\31  > div > div > div > div > div > div.new-tag_4ozgi.new-text-link_3k9GD > div > div.flex-wrapper-top_3ucFS > div.flex-col-left_3trtY.baike-wrapper_6AORN.cu-pt-xs-lg.baike-wrapper-pc_26R04.cu-pt-xl.baike-wrapper-left-pc_5eYY8.cos-space-pb-sm > div > div > p > span:nth-child(2) > span")));

        String text = driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div > div.new-tag_4ozgi.new-text-link_3k9GD > div > div.flex-wrapper-top_3ucFS > div.flex-col-left_3trtY.baike-wrapper_6AORN.cu-pt-xs-lg.baike-wrapper-pc_26R04.cu-pt-xl.baike-wrapper-left-pc_5eYY8.cos-space-pb-sm > div > div > p > span:nth-child(2) > span")).getText();
        System.out.println(text);

        driver.quit();
    }

    /**
     * 普通截屏
     * 当出现异常是,我们不知道是什么情况, 我们可以在异常前抓取屏幕
     * 使用前需要导包
     * <dependency>
     *  <groupId>commons-io</groupId>
     *  <artifactId>commons-io</artifactId>
     *  <version>2.6</version>
     *  </dependency>
     */
    public void test04() throws IOException {
        createDriver();
        /**
         * 普通截屏, 每次生成都会覆盖上一次
         */
        File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(srcFile,new File("my.png"));
        driver.quit();
    }

    /**
     * 高级截屏
     * @param str 调用的方法名称
     */

    public void cutScreen(String str) throws IOException {
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sim2 = new SimpleDateFormat("HHmmss");

        String dirTime = sim1.format(System.currentTimeMillis());
        String fileTime = sim2.format(System.currentTimeMillis());

        String fileName = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";
        File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(srcFile,new File(fileName));
    }
    public void test05() throws IOException {
        createDriver();

        String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();

        cutScreen(methodName);

        driver.quit();
    }
}
